package com.extendy.onlyofficerapiddeployment.controller;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.extendy.onlyofficerapiddeployment.entity.FileEntity;
import com.extendy.onlyofficerapiddeployment.entity.UserEntity;
import com.extendy.onlyofficerapiddeployment.service.FileService;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import java.io.*;
import java.net.URL;
import java.util.Scanner;

@Controller
@RequestMapping("/only-office")
public class OnlyOfficeController {

    @Resource
    private FileService fileService;

    /**
     * 获取文件配置接口
     * 打开文件所需要的配置信息
     */
    @GetMapping("/config/{fileName}")
    public String getConfig(ModelMap map, @PathVariable String fileName){
        // 具体业务处理省略
        // 主要是获取一些信息，用于设置html中的脚本对象config上。
        // 设置视图数据：用户信息、文件信息
        UserEntity userEntity = new UserEntity();
        userEntity.setUserId("123456");
        userEntity.setUsername("张三");
        map.addAttribute("user",userEntity);
        FileEntity file = fileService.getFile(fileName);
        map.addAttribute("fileManager", file);
        // 将html页面返回回去
        return "onlineEdit";
    }

    /**
     * 保存文件接口
     * 当文件状态发生改变时，会调用此接口
     */
    @PostMapping("/saveFile/{fileName}")
    public void saveFile(HttpServletRequest request ,
                         HttpServletResponse response,
                         @PathVariable String fileName) throws Exception {
        PrintWriter writer = response.getWriter();
        Scanner scanner = new Scanner(request.getInputStream()).useDelimiter("\\A");
        String body = scanner.hasNext() ? scanner.next() : "";
        JSONObject jsonObject = JSON.parseObject(body);
        System.err.println(body);
        /*  文档状态
            0 - 找不到具有密钥标识符的文档
            1 - 正在编辑文档，
            2 - 文档已准备好保存，
            3 - 出现文档保存错误，
            4 - 文档关闭，没有任何更改，
            6 - 文档正在编辑，但当前文档状态已保存，
            7 - 强制保存文档时出错。
          */
        if((Integer) jsonObject.get("status") == 2){
            URL url = new URL((String) jsonObject.get("url"));
            java.net.HttpURLConnection connection = (java.net.HttpURLConnection) url.openConnection();
            InputStream inputStream = connection.getInputStream();
            //此处获取到的流即是onlyoffice服务下的文件流。
            //3、将文件保存到本地
            // 具体保存在哪里根据业务需要编写，这里作为测试dome直接保存到当前项目的resources文件夹下
            // 获取 resources 目录的绝对路径
            String resourcesPath = System.getProperty("user.dir") + "/src/main/resources/file/";
            // 创建文件对象
            File file = new File(resourcesPath + fileName);
            try (OutputStream outputStream = new FileOutputStream(file)) {
                // 将内容写入文件
                // 缓冲区大小
                byte[] buffer = new byte[1024];
                int bytesRead;
                // 从输入流读取数据并写入输出流
                while ((bytesRead = inputStream.read(buffer)) != -1) {
                    outputStream.write(buffer, 0, bytesRead);
                }
                System.out.println("文件保存成功：" + file.getAbsolutePath());
            } catch (IOException e) {
                System.err.println("文件保存失败：" + e.getMessage());
            } finally {
                inputStream.close();
            }
            connection.disconnect();
        }
        // 返回给onlyOffice的json数据 0 表示成功 1 表示失败
        writer.write("{\"error\":0}");
    }

}
